#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef int DataType;


typedef struct Node
{
	DataType data;
	struct Node *next;
} SLNode;

/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(SLNode **head)
{
	*head = (SLNode *)malloc(sizeof(SLNode));
	(*head)->next=NULL;
	if(*head == NULL)
		return 1;
	else
		return 0;
}

/* 函数返回由head所表示的单链表的长度。*/
int ListLength(SLNode *head)
{
	int size=0;
	SLNode *p = head;
	while(p ->next != NULL){
		p = p ->next;
		size++;
	}
	return size;
}

// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。
int ListInsert(SLNode *head, int i, DataType x)
{
	SLNode *p,*s;
	int j = -1;
	p = head;
	while(p ->next != NULL && j < i - 1){
		p = p ->next;
		j++;
	}
	if(j != i-1){
		printf("i值不合法！");
		return 1;
	}
	s = (SLNode *)malloc(sizeof(SLNode));
	s ->data = x;
	s ->next = p -> next;
	p ->next = s;
	
	return 0;
}

// 在由head所表示的单链表里删除位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度减1。
int ListDelete(SLNode *head, int i, DataType *x)
{
	int j = -1;
	SLNode *p,*s;
	p = head;
	while(p ->next != NULL && j < i - 1){
		p = p -> next;
		j++;
	}
	if(j != i-1){
		printf("i值不合法！");
		return 1;
	}
	s = p ->next;
	*x = s ->data;
	p ->next = s ->next;
	free(s);
	return 0;
}

// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(SLNode *head, int i, DataType *x)
{
	int j = -1;
	SLNode *p;
	p = head;
	while(p ->next != NULL && j < i){
		p = p -> next;
		j++;
	}
	while(j != i){
		printf("i的值不合法！");
		return 1;
	}
	*x = p ->data;
	return 0;
}

// 释放所有的由head所表示的单链表里的元素节点（含头结点）。当释放完全成功时，函数返回0，否则返回1。
int Destroy(SLNode **head)
{
	SLNode *p, *p1;
	p = *head;
	while(p != NULL)
	{
		p1 = p;
		p = p->next;
		free(p1);
	}
	*head = NULL;
	return 0;
}
